#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;

int kolvo;
string File = "/Users/zadoka/Documents/Dev/project/project/File.txt";
string File2 = "/Users/zadoka/Documents/Dev/project/project/File2.txt";

void reverseString(string& str) {
    reverse(str.begin(), str.end());
}

void clearFile(const string& filename) {
    ofstream fout(filename, ios::trunc); 
    fout.close();
}

void Adding_Passengers(){
    ofstream fout;
    fout.open(File, ios::app);
    int i = 0;
    cin.ignore();
    while(i < kolvo){
        string input, bagazh, massa;
        cout << "Введите ФИО " << i+1 << " пассажира: ";
        getline(cin, input);
        fout << input;
        fout << " ";
        cout << "Введите кол-во багажа " << i+1 << " пассажира: ";
        getline(cin, bagazh);
        fout << bagazh;
        fout << " ";
        cout << "Введите массу багажа " << i+1 << " пассажира: ";
        getline(cin, massa);
        fout << massa;
        fout << endl;
        i++;
    }
    fout.close();
}

void View_File(){
    ifstream fin(File);
    string line;
    while(getline(fin, line)){
        cout << line << endl;
    }
    fin.close();
}

void New_Record(){
    ofstream fout;
    fout.open(File, ios::app);
    cin.ignore();
    string input, bagazh, massa;
    cout << "Введите ФИО нового пассажира: ";
    getline(cin, input);
    fout << input;
    fout << " ";
    cout << "Введите кол-во багажа нового пассажира: ";
    getline(cin, bagazh);
    fout << bagazh;
    fout << " ";
    cout << "Введите массу багажа нового пассажира: ";
    getline(cin, massa);
    fout << massa;
    fout << endl;
    fout.close();
}

void Delete_Passengers(){
    cout << endl;
    ifstream fin(File);
    string line;
    while(getline(fin, line)){
        reverseString(line);
        size_t pos = line.find(' ');
        if(pos != string::npos){
            string substr = line.substr(0, pos);
            reverseString(substr);
            reverseString(line);
            int massa = stoi(substr);
            if(massa > 10){
                ofstream fout;
                fout.open(File2, ios::app);
                fout << line;
                fout << endl;  
                fout.close();
            }
        }else{
            cout << "Что-то пошло не по плану!!" << endl;
        }
    }
    fin.close();
    
    ofstream ofs;
    ofs.open(File, ofstream::out | ofstream::trunc);
    
    ifstream fin2;
    fin2.open(File2);
    string temp;
    while(getline(fin2, line)){
        temp = line;
        ofs << line;
        ofs << endl;
    }
    fin2.close();
    ofstream ofs2;
    ofs2.open(File2, ofstream::out | ofstream::trunc);
    ofs2.close();
    ofs.close();
}

void Replace_massa(){
    cout << endl;
    string input;
    cout << "Введите фамилию: " << endl;
    cin.ignore(); // очищаем символ новой строки из входного потока
    getline(cin, input);
    
    ifstream fin(File);
    ofstream fout(File2);
    string line;
    bool found = false; // флаг для отслеживания найденной фамилии
    while(getline(fin, line)){
        size_t pos = line.find(' ');
        if(pos != string::npos){
            string substr = line.substr(0, pos);
            if (substr == input){
                found = true; // устанавливаем флаг, что фамилия найдена
                cout << "Человек найден!" << endl;
                string line_backap = line;
                reverseString(line);
                size_t pos2 = line.find(' ');
                line_backap = line_backap.substr(0, line.length() - pos2);

            
                cout << "Введите новую массу багажа: ";
                int new_mas;
                cin >> new_mas;
                fout << line_backap << new_mas << endl;
            } else {
                fout << line << endl; 
            }
        } else {
            cout << "Что-то пошло не по плану((" << endl;
        }
    }
    fin.close();
    fout.close();
    
    // Если фамилия не была найдена, выводим сообщение об этом
    if (!found) {
        cout << "Фамилия не найдена." << endl;
    }
    
    // Переносим изменения из временного файла в основной
    ifstream fin2(File2);
    ofstream fout2(File);
    while(getline(fin2, line)){
        fout2 << line << endl;
    }
    fin2.close();
    fout2.close();
}


int main(){
    ofstream ofs2;
    ofs2.open(File2, ofstream::out | ofstream::trunc);
    ofs2.close();
    ofstream ofs;
    ofs.open(File, ofstream::out | ofstream::trunc);
    ofs.close();
    cout << "Введите количество пассажиров: ";
    cin >> kolvo;
    Adding_Passengers();
    cout << endl;
    
    while(1){
        ofstream ofs2;
        ofs2.open(File2, ofstream::out | ofstream::trunc);
        ofs2.close();
        int CASE;
        cout << endl;
        cout << "Выбери программу:\n";
        cout << "1: Просмотреть файл\n";
        cout << "2: Добавить в конец файла новую запись\n";
        cout << "3: Найти и удалить из файла записи о пассажирах, общий вес вещей которых меньше, чем 10 кг\n";
        cout << "4: Изменить вес вещей пассажира по заданной фамилии\n";
        cout << "5: Выход из программы\n";
        cin >> CASE;
        cout << endl;
        switch(CASE){
            case 1:
                cout << "Просмотреть файл" << endl;
                View_File();
                break;
            case 2:
                cout << "Добавить одну новую запись" << endl;
                New_Record();
                break;
            case 3:
                cout << "Пассажиры с багажём меньше 10 кг удалены" << endl;
                Delete_Passengers();
                break;
            case 4:
                Replace_massa();
                break;
            case 5:
                return 0;
                
        }
    }
    
    return 0;
}
